李守中

FreeBSD 13 NFS nfsd man(8) page 2019 中文译本

Table of Contents

1. 译者总注

1.1. 关于此译本

李守中是开源软件理念坚定的支持者,所以译本虽不是软件,但依旧仿照开源软件的协议发布:

  • 无担保:本文作者不保证作品内容准确无误,亦不承担任何由于使用此文档所导致的损失。
  • 自由使用:任何人都可以自由地 阅读/链接/打印 此文档,无需任何附加条件。
  • 名誉权:任何人都可以自由地 转载/引用/再创作 此文档,但必须保留作者署名并注明出处。

如果读者发现作品中有错误的地方,劳请来信指出。任何提高作品质量的建议李守中都将虚心接纳。

1.2. 原文档来源

本文档根据 FreeBSD 13.2 NFS nfsd manpage (man 8 nfsd) 翻译。

1.3. 译者的话

对于直译后无法准确描述软件行为的句子,李守中会根据软件行为对这些句子进行意译。

对于必须添加很多内容才能实现意译的句子,李守中会尽量用直译 + 译者注 的方式来翻译。

受限于李守中的中文水平,在对句子进行意译时可能会偏离作者的本意,请读者谨慎参考。

有能力的读者可以从此链接 FreeBSD_13_NFS_nfsd_man(8)_page_2019.txt 下载英文原文与本文做对照。


2. 名称

nfsd -- 远程 NFS 服务器

3. 摘要

nfsd [-ardute] [-n <num_servers>] [-h <bindip>] [-p <pnfs_setup>]
     [-m <mirror_level>] [-V <virtual_hostname>] [--maxthreads <max_threads>]
     [--minthreads <min_threads>]

4. 描述

nfsd 在 server 上运行以服务来自 client 的 NFS 请求。必须运行至少一个 nfsd 进程,一台机器才能作为 server 运行。

除非另有说明,否则每个 CPU 启动 8 个 nfsd:server 进行 UDP 传输。

下面是可选的选项:

-r

将 NFS 服务注册到 rpcbind(8) 而不创建任何的 server。这个选项可以被 -u-t 选项一起使用以使得 rpcbind server 重启时 nfsd 可以重新注册到 rpcbind server。

-d

将 NFS 服务从 rpcbind(8) 取消注册而不创建任何的 server。

-v <virtual_hostname>

指定一个 hostname 作为 NFS 使用的主要的主机名,而不是使用默认的主机名。

-n <threads>

指定要创建几个 server 进程。这个选项等效于指定 --maxthreads--minthreads 及其各自的线程参数。 译者注: -n 选项的值如果比 --maxthreads 的值大,或者比 --minthreads 的值小的话,nfsd 会将 vfs.nfsd.threads, vfs.nfsd.maxthreadsvfs.nfsd.minthreads 的值设置为 -n 指定的值。

--maxthreads <threads>

指定为相应请求保留的最大 server 线程的数量。

--minthreads <threads>

指定为相应请求保留的最小 server 线程的数量。

-h <bindip>

指定要监听本地主机上的哪个 IP 地址或主机名。当主机有多个接口时,建议使用该选项。可以指定多个 -h 选项。

-a

指定 nfsd 应该绑定到通配符 IP 地址。如果启动 nfsd 时不使用 -h 选项,这是默认选项。在使用 -h 选项之后,依然可以使用该选项。需要注意,nfsd 绑定到通配符 IP 地址时,基于 UDP 的 NFS 都无法正常运行。 译者注: 就是让 nfsd 监听 0.0.0.0,意思是监听所有地址。但是使用这个参数时,NFS 不能工作在 UDP 模式下。

-p <pnfs_setup>

在 server 中启用 pNFS 支持并指定守护进程启动它所需的信息。此选项只能在一台 server 上使用,并指定此 server 将是 pNFS 服务的元数据服务器 (MDS)。这只有在至少有一个 FreeBSD 系统配置为 data server (DS) 供其使用时才能完成。

<pnfs_setup> 字符串是一组由 "," 字符分隔的字段: 这些字段中的每一个都指定一个 DS。DS 由 server 主机名,一个 ":",以及 DS 的数据存储文件系统在此 MDS 服务器上安装的目录路径组成。DS 之后可以选择后跟一个 "#" 和 mds_path 来指定此 MDS 上导出的文件系统的目录路径。如果指定,则意味着此 DS 仅用于存储此 mds_path 文件系统的数据文件。如果此可选组件不存在,则 DS 将用于存储所有导出的 MDS 文件系统的数据文件。在使用指定的选项启动 nfsd 之前,必须在此系统上安装 DS 存储文件系统。

比如: nfsv4-data0:/data0,nfsv4-data1:/data1

这行配置指定了两个 DS server,一个是 nfsv4-data0,另一个是 nfsv4-data1。这两个 DS server 组成了 pNFS 服务的数据存储组件。这两个 DS 应该被用于存储所该 MDS 上所有被导出的文件系统的数据文件。路径 /data0 和 /data1 是数据存储 server 导出的用于存储数据的路径,这个路径应该被 MDS 挂载。

然而对于这个例子来说: nfsv4-data0:/data0#/export1,nfsv4-data1:/data1#/export2

这个配置指定了两个 DS,然而 nfsv4-data0 将只被用于存储 MDS 导出的 /export1 目录的数据,nfsv4-data1 将之被用于存储 MDS 导出的 /exports2 目录的数据。

DS 在使用 IPv6 地址时,要小心使用链接本地地址。DS 的 IPv6 地址被发送到 client,其中没有 scope zone。 因此,链接本地地址可能不适用于 pNFS 客户端到 DS TCP 连接。 解析时,如果 nfsd 是 getaddrinfo(3) 为 DS 主机名返回的唯一地址,则 nfsd 将仅使用链接本地地址。

-m <mirror_level>

这个选项只有在使用 -p 选项时才有效。<mirror_level> 定义了 DS 将拥有一个文件的数据存储文件的几个副本。默认值 1 意味着 DS 上没有数据存储文件的副本。 <mirror_level> 通常设置为 2 以启用镜像,但它的值也可以设置为与 NFSDEV_MAXMIRRORS 变量的值相同。MDS 上的每个导出文件系统必须至少有 "mirror_level" 个DS,如 -p 选项中指定的那样。这意味着,对于上面使用 #/export1 和 #/export2 的示例,无法进行镜像。#/export1 和 #/export2 中的每一个都需要两个 DS 条目,以支持 <mirror_level> 值为 2 的镜像。

如果启用镜像,服务器必须使用灵活文件布局。如果未启用镜像,服务器将默认使用文件布局,但如果 sysctl(8) 控制的 vfs.nfsd.default_flexfile 参数的值设置为非零,则可以将此默认设置更改为灵活文件布局。

-t

client 使用 TCP 与 server 通信。

-u

client 使用 UDP 与 servre 通信。

-e

别管他干嘛用的。为了兼容老版本这个选项才没有去掉。

比如, nfsd -u -t -n 6 意思是使用 6 个线程来与 client 通信,client 使用 TCP 或者 UDP 都可以。

NFS server 应该有足够的线程来处理 client 传来的请求,通常是 4 线程或 6 线程。

nfsd 工具在 NFS 服务器规范中指定的端口侦听服务请求;具体请看 Network File System Protocol Specification, RFC1094, NFS: Network File System Version 3 Protocol Specification, RFC1813, Network File System (NFS) Version 4 Protocol, RFC7530, Network File System (NFS) Version 4 Minor Version 1 Protocol, RFC5661, Network File System (NFS) Version 4 Minor Version 2 Protocol, RFC7862, File System Extended Attributes in NFSv4, RFC8276 and Parallel NFS (pNFS) Flexible File Layout, RFC8435.。

如果 nfsd 检测到 NFS 没有加载到正在运行的内核中,它将尝试使用 kldload(2) 加载包含 NFS 支持的可加载内核模块。如果加载失败,或者没有 NFS KLD 可用,nfsd 将退出并报错。

如果要在具有多个接口或接口别名的主机上运行 nfsd,建议使用 -h 选项。如果不使用 -h 选项,NFS 可能不会响应来自相同 IP 地址的 UDP 数据包。如果有防火墙配置以保护 NFS 流量时,也建议使用此选项,这样 NFS 套接字只能由内部接口访问。然后 ipfw 实用程序将用于阻止从外部接口进入的与 NFS 相关的数据包。

如果 server 停止相应 client 请求并生成类似 nfsd server cache flooded... 的控制台消息,则需要增加 vfs.nfsd.tcphighwater 的值。增加该值之后 server 无需重启即可继续响应 client 的请求。此外,在发生这种情况时可能需要考虑将 vfs.nfsd.tcpcachetimeo 的值减少到几分钟 (以秒为单位) 而不是 12 小时。

不幸的是,参数 vfs.nfsd.tcphighwater 值太大可能会导致达到 mbuf 的限制,如 kern.ipc.nmbufs limit reached 之类的控制台消息所示。如果找不到上述有效的 sysctl 值,可以通过将 vfs.nfsd.cachetcp 设置为 0 来禁用 TCP 的 DRC 缓存。

nfsd 必须通过发送 SIGUSR1 信号终止程序,不能用 SIGTERM 或 SIGQUIT 信号终止程序。 nfsd 程序需要忽略这些信号,以便在关机期间尽可能长时间地保持活动状态,否则环回挂载将无法卸载。如果必须终止 nfsd,只需执行 kill -USR1 <PID of master nfsd>

5. 终止状态

nfsd 的 exit 返回值是 0 表示程序正常,返回值大于 0 表示出现错误。

6. 更多信息

nfsstat(1), kldload(2), nfssvc(2), nfsv4(4), pnfs(4), pnfsserver(4), exports(5), stablerestart(5), gssd(8), ipfw(8), mountd(8), nfsiod(8), nfsrevoke(8), nfsuserd(8), rpcbind(8)

7. 历史

nfsd 程序自 4.4BSD 出现。

8. BUGS

如果 nfsd 启动时 gssd(8) 还没有运行,nfsd 将只处理 AUTH_SYS 请求。先启动 gssd(8) 后,再重启 nfsd 可以解决这个问题。

对于灵活的文件布局 pNFS server,如果有 Linux NFS client 使用 NFSv4.1 或 NFSv4.2 挂载 server 导出的目录,这些 client 可能需要 server 将 sysctl(8) vfs.nfsd.flexlinuxhack 的值设为 1 来解决问题。

Linux 5.x 版本的内核已经有了相关的补丁,所以不再需要在 server 上设置 vfs.nfsd.flexlinuxhack 参数。

FreeBSD 13.0 2019.12.20



Last Update: 2023-06-23 Fri 17:17

Generated by: Emacs 28.2 (Org mode 9.5.5)   Contact: [email protected]

若正文中无特殊说明,本站内容遵循: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议